package it.okkam.rivelamaps;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.Polygon;
import com.vividsolutions.jts.io.ParseException;
import com.vividsolutions.jts.io.WKTReader;
import com.vividsolutions.jts.operation.polygonize.Polygonizer;
import com.vividsolutions.jtstest.testbuilder.CreationTool;

public class GetListaPoligoni {
	
	static String filePath = "/home/okkam/Nicola/provatxt.txt";
	
	public GetListaPoligoni(){}
		//public static void main(String[] args){
public static ArrayList<ParticellaCatastale>  getListaParticelle(){	
			ReadFileCSVCatasto lettore = new ReadFileCSVCatasto();
	    	ArrayList<ArrayList<Punto>> poligoniCatasto = ReadFileCSVCatasto.creaListaPoligoni(lettore.apriStream(filePath));
	    	//System.out.println("poligoni catasto test "+poligoniCatasto.size());
			ArrayList<ParticellaCatastale> ArrayParticelleCatastali = new ArrayList<ParticellaCatastale>();
			ArrayParticelleCatastali = creaArrayParticelle(poligoniCatasto);
			return ArrayParticelleCatastali;
			
		}
		
	
	public static ArrayList<ParticellaCatastale> creaArrayParticelle (ArrayList<ArrayList<Punto>> arrayPuntiCat){
		ArrayList<ParticellaCatastale> arrayPart = new ArrayList<ParticellaCatastale>();
		
		ArrayList<Punto> arrayPunti = null;
		Iterator<ArrayList<Punto>> ipolCatasto = arrayPuntiCat.iterator();
		Punto punto = null;
		while (ipolCatasto.hasNext()){
			 
			//ArrayList<String> arrayStringheVertici = new ArrayList<String>();
			punto = new Punto();
			ParticellaCatastale particellaCatastale = new ParticellaCatastale();
		
			// qui creo il punto per inserirlo nella particella 
			arrayPunti = ipolCatasto.next();
			Iterator<Punto> ipunto = arrayPunti.iterator();
			while (ipunto.hasNext()){
				punto = ipunto.next();				
			}	
			
			String stringaVertici = "";
			stringaVertici = creaListaVertici(arrayPunti);
			//System.out.println("stringa vertici "+stringaVertici);
			particellaCatastale = creaPoligono(stringaVertici, punto, arrayPunti);
			arrayPart.add(particellaCatastale);		
			
			}
		
		return arrayPart;
	}
		
	public static String creaListaVertici(ArrayList<Punto> arrayPunti) {

		Punto punto = null;
		Iterator<Punto> ipunti = arrayPunti.iterator();
		int numPunti = arrayPunti.size();
		String primoPunto=  arrayPunti.get(0).getX()+ " " + arrayPunti.get(0).getY();
		
		String listaVertici = "LINESTRING (";		
		while (ipunti.hasNext()){
			punto = ipunti.next();
			listaVertici += punto.getX();
			listaVertici += " ";
			listaVertici += punto.getY();
			numPunti--;
			if (numPunti > -1)	
				listaVertici += ", ";		
		}
		listaVertici += primoPunto;
		listaVertici += ")";
				
		return listaVertici;
	}
	
	
	public static Punto restituisciPunto (ArrayList<Punto> arrayPunti){
		Punto punto = null;
		
		Iterator<Punto> ipunti = arrayPunti.iterator();
				
		while (ipunti.hasNext()){
			punto = ipunti.next();
			
		}
		
		
		return punto;
		
		
	}
	public static ParticellaCatastale creaPoligono(String stringaPunti, Punto punto, ArrayList<Punto> arrayPunti){
		ParticellaCatastale particella = new ParticellaCatastale();
		Polygon p = null;
		WKTReader reader = new WKTReader();
		Polygonizer polygonizer = new Polygonizer();
		Collection<Geometry> lines = new ArrayList();
		Collection polys = null;
		//String prova = "LINESTRING (45.956661 10.907986, 45.956169 10.907664, 45.955897 10.908403 , 45.956433 10.908758, 45.956661 10.907986)";
		
		try {
			
			lines.add(reader.read(stringaPunti));
			}
		
		catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
		
		polygonizer.add(lines);
		
		polys   =  polygonizer.getPolygons();
		//System.out.println("polys size"+polys.size());
		Iterator i = polys.iterator();
		while(i.hasNext()){
			
			p = (Polygon) i.next();
			 // da controllare!!!!!
		} 
		particella = setParticella(p, punto, arrayPunti);
		
		return particella ;
	
	}
	
	public static ParticellaCatastale setParticella(Polygon poligono ,Punto punto, ArrayList<Punto> arrayPunti){
		ParticellaCatastale particella = new ParticellaCatastale();
		
		particella.setPoligono(poligono);
		particella.setCodiceComune(punto.getCodiceComune());
		particella.setDenominatore(punto.getDenominatore());
		particella.setNumero(punto.getNumero());
		particella.setArrayPunti(arrayPunti);
		
		
		return particella;
		
	}
	
	
}

